<?php

require_once __DIR__ . '/AbstractDAO.php';
require_once __DIR__ . '/../../util/DataUtil.php';

/**
 * Classe abstrata para métodos comuns aos DAOs de Alunos do ensino regular e do
 	* EJA.
 *
 * @author Hyzandey
 */
abstract class AbstractAlunoDAO extends AbstractDAO {

	const CRE_COLUNA = 'cre';
	const NOME_ESCOLA_COLUNA = 'nome_escola';
	const COD_ESCOLA_COLUNA = 'cod_escola';
	const ESCOLA_ONLINE_COLUNA = 'escola_online';
	const TURNO_COLUNA = 'turno';
	const ANO_SEM_COLUNA = 'ano_sem';
	const CEP_ALUNO_COLUNA = 'cep_aluno';
	const COD_ALUNO_COLUNA = 'cod_aluno';
	const NOME_ALUNO_COLUNA = 'nome_aluno';
	const DT_NASC_ALUNO_COLUNA = 'dt_nasc_aluno';
	const LOGRADOURO_COLUNA = 'logr_aluno';
	const CIDADE_ALUNO_COLUNA = 'cidade_aluno';
	const ENDERECO_ALUNO_COLUNA = 'end_aluno';
	const NOME_MAE_COLUNA = 'nome_mae';
	const NUM_CHAMADA_COLUNA = 'num_chamada';
	const UF_COLUNA = 'uf_aluno';
	const TEL_MAE_COLUNA = 'tel_mae_aluno';
	const SEXO_COLUNA = 'sexo_masculino';
	const SIM_VALOR_BASE = 's';
	
	private $isSelectAllExecuted = false;

	protected abstract function getQueryPrincipal();

	protected abstract function constroiAluno();

	protected function retornaListaAlunos() {
		$alunoList = array();
		while ($aluno = $this->proximoAluno()) {

			$alunoList[] = $aluno;
		}

		return $alunoList;
	}

	/**
	 * @return Aluno|NULL Próximo aluno da lista de resultados, 
	 * ou null, se for o caso;
	 */
	public function proximoAluno(){
		
		$this->executeSelectAll();
		
		if($linha = $this->proximaLinhaResultado()){
			$aluno = $this->constroiAluno();
			
			$this->preencheAluno($aluno, $linha);
			return $aluno;
		}
		return null;
	}

	protected function preencheAluno(&$aluno, $linha) {

		$aluno->setAnoSem(DataUtil::getValor($linha[self::ANO_SEM_COLUNA]));
		$aluno->setCep(DataUtil::getValor($linha[self::CEP_ALUNO_COLUNA]));
		$aluno->setCodigo(DataUtil::getValor(
				$linha[self::COD_ALUNO_COLUNA])
		);
		$aluno->setCodTurno(DataUtil::getValor($linha[self::TURNO_COLUNA]));
		$aluno->setCodUnidade(DataUtil::getValor(
				$linha[self::COD_ESCOLA_COLUNA]
		)
		);
		$aluno->setCre(DataUtil::getValor($linha[self::CRE_COLUNA]));
		$aluno->setDtNascimento(DataUtil::getValor(
				$linha[self::DT_NASC_ALUNO_COLUNA]
		));
		$aluno->setEndereco(DataUtil::getValor(
				$linha[self::ENDERECO_ALUNO_COLUNA]
		));
		$aluno->setFoneMae(DataUtil::getValor(
				$linha[self::TEL_MAE_COLUNA]
		));

		$isMasculino = DataUtil::getValor(
				$linha[self::SEXO_COLUNA]);

		$aluno->setIsMasculino($isMasculino
				=== null ? null : $isMasculino === 'f' ? FALSE : TRUE);

		$isOnline = DataUtil::getValor(
				$linha[self::ESCOLA_ONLINE_COLUNA]);

		$aluno->setIsOnline($isOnline === null ? null : $isOnline
				=== 'f' ? false : true);
		$aluno->setLogradouro(DataUtil::getValor(
				$linha[self::LOGRADOURO_COLUNA]
		));
		$aluno->setNomeCidade(DataUtil::getValor(
				$linha[self::CIDADE_ALUNO_COLUNA]
		));
		$aluno->setNomeMae(DataUtil::getValor(
				$linha[self::NOME_MAE_COLUNA]
		));
		$aluno->setNumChamada(DataUtil::getValor(
				$linha[self::NUM_CHAMADA_COLUNA]
		));
		$aluno->setUfCidade(DataUtil::getValor(
				$linha[self::UF_COLUNA]
		));
		$aluno->setNomeUnidade(DataUtil::getValor(
				$linha[self::NOME_ESCOLA_COLUNA]
		));
		$aluno->setNome(DataUtil::getValor(
				$linha[self::NOME_ALUNO_COLUNA]
		));
	}

	protected function parametrizaQuery() {
		$this->insertWhere($cre = $this->ajustaStringFiltro(
				$this->filter->getCre())
				, " and cre ilike '$cre' ");

		$this->insertWhere($escola = $this->ajustaStringFiltro(
				$this->filter->getNomeEscola())
				, "and nome_escola ilike '%$escola%'");

		$this->insertWhere($turno = $this->ajustaStringFiltro(
				$this->filter->getTurno()), "and turno ilike '$turno'");


		$this->insertWhere($anoSem = $this->ajustaStringFiltro(
				$this->filter->getAnoSem())
				,"and ano_sem = $anoSem");

		$this->processaEscolaIdList();
	}

	public function find() {
		$this->executeSelectAll();

		return $this->retornaListaAlunos();
	}
	
	protected function executeSelectAll(){
		
		if($this->isSelectAllExecuted){
			return;
		}
		
		$this->query = $this->getQueryPrincipal();
		
		$this->parametrizaQuery();
		
		$this->executaQuery();
		
		$this->isSelectAllExecuted = true;
	}

	protected function processaEscolaIdList() {

		$escolaIdList = $this->filter->getEscolaIdList();
		$listSize = sizeof($escolaIdList);

		//Não há filtro
		if ($listSize < 1) {
			return;
		}

		$whereString = " and trim(leading '0' FROM cod_escola)::int in (";

		$whereString .= DataUtil::getValuesAsString($escolaIdList);

		$whereString .= ') ';

		$this->insertWhere(true, $whereString);
	}

}

?>
